/**
 * 哈沙德数是指在某个固定的进位制当中，可以被各位数字之和整除的正整数。例如：
 * <p>
 * 126 是十进制下的一个哈沙德数，因为
 * (126)₁₀ % (1 + 2 + 6) = 0；
 * <p>
 * 126 也是八进制下的哈沙德数，因为
 * (126)₁₀ = (176)₈，
 * (126)₁₀ % (1 + 7 + 6) = 0；
 * <p>
 * 同时，126 也是十六进制下的哈沙德数，因为
 * (126)₁₀ = (7e)₁₆，
 * (126)₁₀ % (7 + e) = 0。（ e 表示十进制中的 14 ）
 * <p>
 * 小蓝认为，如果一个整数在二进制、八进制、十进制、十六进制下均为哈沙德数，那么这个数字就是幸运数字。第 1 至第 10 个幸运数字的十进制表示为：
 * 1, 2, 4, 6, 8, 40, 48, 72, 120, 126…
 * <p>
 * 现在他想知道第 2023 个幸运数字是多少？你只需要告诉小蓝这个整数的十进制表示即可。
 */
public class 哈沙德数 {
    /**
     * 求各个位数字之和
     *
     * @param n 传入的数
     * @param k 进制
     * @return n 的各个位数字之和
     */
    static int getModSum(int n, int k) {
        int sum = 0;
        while (n > 0) {
            sum += n % k;
            // 取下一位
            n /= k;
        }
        return sum;
    }

    /**
     * 检查传入数字是否为哈沙德数
     *
     * @param n 传入的数
     * @return 返回结果
     */
    static boolean isHashed(int n) {
        // 求不同进制下各个位数字之和
        int sum2 = getModSum(n, 2);
        int sum8 = getModSum(n, 8);
        int sum10 = getModSum(n, 10);
        int sum16 = getModSum(n, 16);

        // 非空判断以及沙哈得数判断
        return sum2 != 0 && n % sum2 == 0 &&
                sum8 != 0 && n % sum8 == 0 &&
                sum10 != 0 && n % sum10 == 0 &&
                sum16 != 0 && n % sum16 == 0;
    }

    public static void main(String[] args) {
        int i = 1;
        // 查询第 n 个哈沙德数
        int n = 2023;
        while (n > 0) {
            // 如果为哈沙德数，则 n--
            if (isHashed(i)) {
                n--;
                if (n == 0) {
                    System.out.println(i);
                    break;
                }
            }
            // 继续下一个数
            i++;
        }
    }
}
